/**
 * 数据配置类
 * @see {@link Config}
 * @anthor Jn
 */
export default class Config {

    /**
     * Log日志配置
     */
    public static readonly Log = {
        /**
         * 输出日志是否为JSON类型
         */
        outputJSON: false,
        /**
         * 日志输出地址
         */
        dir: `${process.env.npm_config_local_prefix}/logs/${process.env.npm_package_name}`,
        /**
         * 打印日志
         * 日志分为 NONE，DEBUG，INFO，WARN 和 ERROR 5 个级别。
         */
        level: 'DEBUG',
        /**
         * 是否在生产环境打印 DEBUG 日志进行调试
         */
        allowDebugAtProd: true,
        /**
         * 默认会关闭终端日志输出
         * disableConsoleAfterReady: false,
         */
    }
    /**
     * csrf安全配置
     */
    public static readonly CSRF = {
        /**
         * xframe安全插件
         */
        xframe: {
            /**
             * 是否开启xframe插件
             */
            enable: false,
        },
        /**
         * csp安全插件
         */
        csp: {
            /**
             * 是否开启csp插件
             */
            enable: false,
            /**
             * 地址匹配
             */
            ignore: '/',
            /**
             * 地址匹配下是否开启xframe
             */
            xframe: {
                /**
                 * 开启
                 */
                enable: false
            }
        },
        /**
         * csrf安全插件
         */
        csrf: {
            /**
             * 是否解析json格式数据
             */
            ignoreJSON: true,
            /**
             * 设置请求头
             */
            headerName: 'x-csrf-token',
            /**
             * get请求携带参数
             */
            queryName: '_csrf',
            /**
             * post请求携带参数
             */
            bodyName: '_csrf',
            /**
             * 白名单
             */
            refererWhiteList: ['*'],
            /**
             * 是否开启安全插件csrf
             */
            enable: false,
        },
        /**
         * 白名单
         */
        domainWhiteList: ['*']
    }
    /**
     * 跨域配置
     */
    public static readonly CORS = {
        /**
         * 允许跨域请求地址
         */
        origin: '*',
        /**
         * 允许跨域请求的方法
         */
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH',
        /**
         * 允许请求携带Cookie
         */
        credentials: true
    }
    /**
     * 中间件配置
     */
    public static readonly MIDDLEWARE = ['catchError']
    /**
     * 中间件匹配配置
     */
    public static readonly BODYPARSER = {
        /**
         * 中间件匹配是否开启
         */
        enable: true,
        /**
         * 解析格式，默认utf-8
         */
        encoding: 'utf-8',
        /**
         * 表单大小，默认1mb
         */
        formLimit: '1mb',
        /**
         * json数据，默认1mb
         */
        jsonLimit: '1mb',
        /**
         * 文本数据，默认1mb
         */
        textLimit: '1mb',
        /**
         * 严格模式，开启后只接受json格式
         */
        strict: false,
        /**
         * 参数配置
         */
        queryString: {
            /**
             * 数组大小为100
             */
            arrayLimit: 100,
            /**
             * 对象深度5层
             */
            depth: 5,
            /**
             * 参数1000个
             */
            parameterLimit: 1000,
        },
        /**
         * 接受类型，默认['json', 'form']
         */
        enableTypes: ['json', 'form'],
        /**
         * 匹配接口
         */
        match: '/api'
    }
    /**
     * 不需要登录授权的接口
     */
    public static readonly IGNORE_LOGIN_ROUTES = [
        new RegExp(`/`)
    ]

    /**
     * axios配置
     */
    public static readonly AxiosPlus = {
        /**
         * 请求头配置
         */
        headers: {
            /**
             * 配置
             */
            common: {
                'Content-Type': 'application/json; charset=UTF-8'
            }
        },
        /**
         * 超时时间 默认5秒
         */
        timeout: 0,
        /**
         * 是否挂载app
         */
        app: true,
        /**
         * 是否挂载agent
         */
        agent: false,
    }

    /**
     * 项目运行配置
     */
    public static readonly Cluster = {
        /**
         * 端口监听配置
         */
        listen: {
            /**
             * 运行端口
             */
            port: 7003,
            /**
             * 启动地址
             */
            hostname: "0.0.0.0"
        }
    }
    public static readonly SECURITY = {
        SECRET_KEY: 'Jn10013108@'
    };
}
